import type { AttributeType } from '../attributes/type';
import {
  CombatAttributes,
  type AttributesConfig,
} from '../attributes/combat-attributes';
import {
  type RewardConfig,
  type RewardPoolConfig,
  REWARD_TYPE,
} from '../reward/type';
import { type EnemyType } from '../../data/enemy';

/**
 * 敌人配置接口
 * 定义创建敌人实例所需的所有配置参数
 */
export interface EnemyConfig {
  /** 敌人唯一标识符 */
  id: string;
  /** 敌人显示名称 */
  name: string;
  /** 敌人背景描述（可选） */
  description?: string;
  /** 敌人类型分类 */
  type: EnemyType;
  /** 敌人属性配置 */
  attributesConfig: AttributesConfig;
  /** 击败敌人后可获得的奖励池配置 */
  rewards: RewardPoolConfig[];
}

/**
 * 奖励详细信息接口
 * 用于展示给玩家的奖励信息
 */
export interface RewardInfo {
  /** 奖励类型 */
  type: string;
  /** 奖励名称 */
  name: string;
  /** 经验值数量（仅对经验奖励有效） */
  amount?: number;
  /** 物品数量（仅对物品奖励有效） */
  quantity?: number;
  /** 物品ID（仅对物品奖励有效） */
  itemId?: string;
  /** 奖励描述信息 */
  description?: string;
}

/**
 * 敌人实体类
 * 代表游戏中的一个可战斗的敌人单位
 * 负责管理敌人的属性、奖励和行为逻辑
 */
export class Enemy {
  /** 敌人唯一标识符 */
  readonly id: string;
  /** 敌人显示名称 */
  readonly name: string;
  /** 敌人背景描述 */
  private readonly description?: string;
  /** 敌人类型分类 */
  private readonly type: EnemyType;
  /** 敌人战斗属性管理器 */
  readonly attributes: CombatAttributes;
  /** 击败敌人后可能掉落的奖励池 */
  private readonly rewards: RewardPoolConfig[];

  /**
   * 创建敌人实例
   * @param config - 敌人配置对象
   */
  constructor(config: EnemyConfig) {
    this.id = config.id;
    this.name = config.name;
    this.description = config.description;
    this.type = config.type;
    this.attributes = new CombatAttributes(config.attributesConfig);
    this.rewards = config.rewards;
  }

  /**
   * 获取敌人所有属性的当前快照
   * @returns 包含所有属性名称和值的对象
   */
  getAttributeSnapshot() {
    return this.attributes.getAttributeSnapshot();
  }

  /**
   * 获取指定属性的当前数值
   * @param attributeKey - 要查询的属性键名
   * @returns 属性的当前数值
   */
  getAttributeValue(attributeKey: AttributeType): number {
    return this.attributes.getAttributeValue(attributeKey);
  }

  /**
   * 获取敌人的基本信息
   * @returns 包含ID、名称、描述和类型的对象
   */
  getInfo() {
    return {
      id: this.id,
      name: this.name,
      description: this.description,
      type: this.type,
    };
  }

  /**
   * 获取敌人的原始奖励配置
   * @returns 奖励池配置数组
   */
  getRewards() {
    return this.rewards;
  }

  /**
   * 获取格式化的奖励详细信息
   * 包含概率、权重等元信息，适合在 UI 中显示
   * @returns 格式化后的奖励信息数组
   */
  getRewardInfo(): RewardInfo[] {
    const rewardInfos: RewardInfo[] = [];

    // 遍历所有奖励池
    for (const rewardPool of this.rewards) {
      // 遍历奖励池中的每个奖励配置
      for (const rewardConfig of rewardPool.rewards) {
        const rewardInfo: RewardInfo = {
          type: rewardConfig.type,
          name: rewardConfig.name || this.getDefaultRewardName(rewardConfig),
        };

        // 根据奖励类型设置不同的属性值
        if (rewardConfig.type === REWARD_TYPE.EXP) {
          rewardInfo.amount = rewardConfig.amount;
        } else if (rewardConfig.type === REWARD_TYPE.ITEM) {
          rewardInfo.quantity = rewardConfig.quantity;
          rewardInfo.itemId = rewardConfig.itemId;
        }

        // 添加描述信息（如果有）
        if (rewardConfig.description) {
          rewardInfo.description = rewardConfig.description;
        }

        // 添加概率信息到描述中
        if (rewardConfig.rate !== undefined) {
          rewardInfo.description = `${rewardInfo.description || ''} (概率: ${(
            rewardConfig.rate * 100
          ).toFixed(1)}%)`.trim();
        }

        // 添加权重信息到描述中
        if (rewardConfig.weight !== undefined) {
          rewardInfo.description = `${rewardInfo.description || ''} (权重: ${
            rewardConfig.weight
          })`.trim();
        }

        // 标记必掉奖励
        if (rewardConfig.guaranteed) {
          rewardInfo.description = `${
            rewardInfo.description || ''
          } [必掉]`.trim();
        }

        rewardInfos.push(rewardInfo);
      }
    }

    return rewardInfos;
  }

  /**
   * 根据奖励配置生成默认的奖励名称
   * @param rewardConfig - 奖励配置对象
   * @returns 默认的奖励显示名称
   */
  private getDefaultRewardName(rewardConfig: RewardConfig): string {
    switch (rewardConfig.type) {
      case REWARD_TYPE.EXP:
        return '经验值';
      case REWARD_TYPE.ITEM:
        // 在实际项目中，这里应该从物品配置中获取名称
        return `物品: ${rewardConfig.itemId}`;
      default:
        return '未知奖励';
    }
  }

  /**
   * 获取简化的奖励信息
   * 只包含核心数据，适合用于数据处理和传输
   * @returns 简化的奖励信息数组
   */
  getSimpleRewardInfo(): Array<{
    type: string;
    amount?: number;
    quantity?: number;
    itemId?: string;
  }> {
    const simpleInfos: Array<{
      type: string;
      amount?: number;
      quantity?: number;
      itemId?: string;
    }> = [];

    for (const rewardPool of this.rewards) {
      for (const rewardConfig of rewardPool.rewards) {
        const simpleInfo: any = { type: rewardConfig.type };

        // 设置奖励的具体数值
        if (rewardConfig.type === REWARD_TYPE.EXP && rewardConfig.amount) {
          simpleInfo.amount = rewardConfig.amount;
        } else if (rewardConfig.type === REWARD_TYPE.ITEM) {
          if (rewardConfig.quantity)
            simpleInfo.quantity = rewardConfig.quantity;
          if (rewardConfig.itemId) simpleInfo.itemId = rewardConfig.itemId;
        }

        simpleInfos.push(simpleInfo);
      }
    }

    return simpleInfos;
  }
}
